﻿
namespace SerialInput;

public class BarcodeWorkerService : BackgroundService
{
    private readonly ILogger<SerialPortManager> _logger;
    private readonly IConfiguration _config;
    private SerialPortManager? _serialManager;

    // 保存串口配置，key 为 Name
    private Dictionary<string, SerialPortConfig> _portConfigs = new();

    public BarcodeWorkerService(ILogger<SerialPortManager> logger, IConfiguration config)
    {
        _logger = logger;
        _config = config;
    }

    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        _logger.LogInformation("多串口服务启动");

        // 读取配置
        var connConfigs = _config.GetSection("Conn").Get<List<SerialPortConfig>>() ?? new();
        _portConfigs = connConfigs.ToDictionary(c => c.Name, c => c, StringComparer.OrdinalIgnoreCase);
        // 初始化 MQTT 长连接（只取第一个电子秤的连接信息）
        // var scaleCfg = connConfigs.FirstOrDefault(c => c.Type == 2 && !string.IsNullOrWhiteSpace(c.Conn));
        // if (scaleCfg != null)
        // {
        //     await MqttHelper.Init(scaleCfg.Conn);
        // }
        // 初始化串口管理器
        _serialManager = new SerialPortManager(_logger, _config);

        // 订阅事件
        _serialManager.DataReceived += OnSerialDataReceived;
        _serialManager.StatusChanged += OnStatusChanged;

        // 尝试连接
        _serialManager.AutoConnect();

        // 保持服务运行
        while (!stoppingToken.IsCancellationRequested)
        {
            await Task.Delay(1000, stoppingToken);
        }
    }

    /// <summary>
    /// 串口数据处理
    /// </summary>
    private void OnSerialDataReceived(string portName, ParsedData data)
    {
        try
        {
            _logger.LogInformation($"[{portName}] 收到数据: {data.RawText}");

            if (!_portConfigs.TryGetValue(portName, out var cfg))
            {
                _logger.LogWarning($"未找到 {portName} 的配置，忽略数据");
                return;
            }

            switch (cfg.Type)
            {
                case 1: // 剪切板发送（扫码枪）
                    HandleScannerDataClipboard(data);
                    break;
                case 2: // 模拟输入发送
                    HandleScannerDataUnicode(data);
                    break;
                case 3: // Mqtt 发送（电子秤）
                    HandleScaleData(cfg, data);
                    break;

                default:
                    _logger.LogWarning($"未知设备类型 {cfg.Type}，忽略数据");
                    break;
            }
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, $"处理 {portName} 数据失败");
        }
    }

    /// <summary>
    /// 剪切板输出
    /// </summary>
    private void HandleScannerDataClipboard(ParsedData data)
    {
        var focusInfo = KeyboardSimulator.GetFocusInfo();
        if (focusInfo.IsInputControl)
        {
            var success = KeyboardSimulator.SendTextClipboard(data.RawText, addEnter: false, addTab: false);
            _logger.LogInformation(success
                ? $"剪切板粘贴成功: {data.RawText}"
                : $"剪切板粘贴失败: {data.RawText}");
        }
    }
    /// <summary>
    /// 模拟键盘逐字输入
    /// </summary>
    private void HandleScannerDataUnicode(ParsedData data)
    {
        var focusInfo = KeyboardSimulator.GetFocusInfo();
        if (focusInfo.IsInputControl)
        {
            var success = KeyboardSimulator.SendTextUnicode(data.RawText, delayMs: 10);
            _logger.LogInformation(success
                ? $"逐字输入成功: {data.RawText}"
                : $"逐字输入失败: {data.RawText}");
        }
    }
    /// <summary>
    /// 电子秤逻辑：通过 MQTT 发送
    /// </summary>
    private void HandleScaleData(SerialPortConfig cfg, ParsedData data)
    {
        if (string.IsNullOrWhiteSpace(cfg.Conn) || string.IsNullOrWhiteSpace(cfg.Topic))
        {
            _logger.LogWarning($"电子秤 {cfg.Name} 未配置 MQTT 连接信息");
            return;
        }

        try
        {
            // 这里假设你有一个 MqttHelper 类来发送数据
            // MqttHelper.Publish(cfg.Conn, cfg.Topic, data.RawText);
            _logger.LogInformation($"电子秤数据已发送到 MQTT: {cfg.Topic} => {data.RawText}");
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "发送电子秤数据到 MQTT 失败");
        }
    }

    /// <summary>
    /// 状态变化处理
    /// </summary>
    private void OnStatusChanged(string status)
    {
        _logger.LogInformation($"状态变化: {status}");
    }

    public override async Task StopAsync(CancellationToken cancellationToken)
    {
        _logger.LogInformation("多串口服务停止");

        _serialManager?.Dispose();

        await base.StopAsync(cancellationToken);
    }
}